package com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则;

import com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则.assembly.IntelCpu;
import com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则.assembly.KingstonMemory;
import com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则.assembly.XiJieHardDisk;
import com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则.finishedProduct.BadComputer;
import com.example.myDesignPatterns.softwareDesignPrinciples.依赖倒转原则.finishedProduct.GoodComputer;

public class TestComputer {
    /**
     高层模块不应该依赖低层模块，两者都应该依赖其抽象；
     抽象不应该依赖细节，细节应该依赖抽象。
     简单的说就是要求对抽象进行编程，不要对实现进行编程，这样就降低了客户与实现模块间的耦合。







     下面看一个例子来理解依赖倒转原则

     【例】组装电脑

     现要组装一台电脑，需要配件cpu，硬盘，内存条。只有这些配置都有了，计算机才能正常的运行。
     选择cpu有很多选择，如Intel，AMD等，硬盘可以选择希捷，西数等，内存条可以选择金士顿，海盗船等。

     */
    public static void main(String[] args) {
        //坏电脑只能用这一套
        BadComputer badComputer = new BadComputer();
        badComputer.setHardDisk(new XiJieHardDisk());
        badComputer.setCpu(new IntelCpu());
        badComputer.setMemory(new KingstonMemory());

        badComputer.run();

        //好电脑是抽象的，可以自由组合
        GoodComputer goodComputer = new GoodComputer();
        goodComputer.setHardDisk(new XiJieHardDisk());
        goodComputer.setCpu(new IntelCpu());
        goodComputer.setMemory(new KingstonMemory());

        goodComputer.run();
    }
    /**
     *
     依赖倒转原则（Dependence Inversion Principle, DIP）是面向对象设计的SOLID原则之一，由Robert C. Martin提出。这一原则强调软件实体（如类、模块和函数）应当依赖于抽象而不是具体实现。
     具体来说，依赖倒转原则包括以下几点核心内容：
     高层模块不应依赖于低层模块，两者都应依赖于抽象：在软件架构中，高层次的策略和政策定义不应该依赖于低层次的组件实现细节，而是应该共同依赖于抽象的接口或抽象类。这样可以确保各层之间的松耦合。
     抽象不应该依赖于细节，细节应该依赖于抽象：这意味着接口或抽象类应当定义稳定的行为，而具体的实现类则遵循这些行为的定义。这样，当实现细节变化时，不会影响到使用这些抽象的高层模块。
     面向接口编程：鼓励编写代码时针对接口或者抽象基类编程，而不是针对具体类。这样可以在运行时灵活地替换不同的实现，提高代码的灵活性和可扩展性。
     设计中强调稳定性和可变性分离：抽象是相对稳定的，而具体实现是多变的。依赖倒转原则促使设计者将易变的部分（实现细节）从不变的部分（接口或抽象）中分离出来，从而降低系统的复杂性和维护成本。
     依赖倒转原则的实践有助于实现软件的开闭原则（Open/Closed Principle），即对扩展开放，对修改关闭，从而促进软件的可维护性和可扩展性。
     */
}